package com.tzeng.hist.manager;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Environment;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer;
import com.tzeng.hist.R;

/**
 * 图片异步加载和图像处理工具类
 * 
 * @author Administrator
 * 
 */
public class ImageManager {
	/**
	 * 获取图片加载
	 * 
	 * @return
	 */
	public static ImageLoader getInstance() {
		return ImageLoader.getInstance();
	}

	/**
	 * 新闻图片缓存设置
	 */

	private static DisplayImageOptions newsHeadOptions;

	public static DisplayImageOptions getNewsHeadOptions() {
		if (newsHeadOptions == null) {
			newsHeadOptions = new DisplayImageOptions.Builder()
					.showImageForEmptyUri(R.drawable.shove_load_default)
					.showImageOnFail(R.drawable.shove_load_default)
					.showImageOnLoading(R.drawable.shove_load_default)
					.cacheInMemory(true) // 缓存内存
					.cacheOnDisc(true)// 缓存文件
					.build();
		}
		return newsHeadOptions;
	}

	private static DisplayImageOptions viewsHeadOptions;

	public static DisplayImageOptions getViewsHeadOptions() {
		if (viewsHeadOptions == null) {
			viewsHeadOptions = new DisplayImageOptions.Builder()
					.showImageOnLoading(R.drawable.shove_load_default)
					.showImageForEmptyUri(R.drawable.shove_load_default)
					.showImageOnFail(R.drawable.shove_load_default)
					.resetViewBeforeLoading(false).cacheOnDisc(true)
					.cacheInMemory(true).imageScaleType(ImageScaleType.EXACTLY)
					.bitmapConfig(Bitmap.Config.RGB_565)
					.considerExifParams(true)
					.displayer(new FadeInBitmapDisplayer(100)).build();
		}
		return viewsHeadOptions;
	}

	/**
	 * 获取网络字节流
	 * 
	 * @param path
	 * @return
	 * @throws Exception
	 */
	public static byte[] getImageByByte(String path) throws Exception {
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		URL url = new URL(path);
		// HttpClientConnection 是对 HttpURLConnection的封装，不建议使用
		/*
		 * HttpsURLConnection与HttpURLConnection就是http与https的区别
		 */
		HttpURLConnection httpURLConnection = (HttpURLConnection) url
				.openConnection();
		httpURLConnection.setConnectTimeout(5000);

		httpURLConnection.setRequestMethod("GET");
		if (httpURLConnection.getResponseCode() == 200) {
			InputStream inputStream = httpURLConnection.getInputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			// 读到buffer中间
			while ((len = inputStream.read(buffer)) != -1) {
				// 从buffer中读数据
				byteArrayOutputStream.write(buffer, 0, len);

			}

			inputStream.close();

		}
		return byteArrayOutputStream.toByteArray();

	}

	/**
	 * 保存bitmap到本地指定目录
	 * 
	 * @param bmp
	 * @return int 1=成功 -1失败 0没有sd卡
	 */
	public static int saveBitmap(Bitmap bmp) {
		if (!android.os.Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED)) {
			return 0;
		}
		String path = Environment.getExternalStorageDirectory() + "/eims";
		File dir = new File(path);
		if (null == dir || !dir.exists() || !dir.isDirectory()) {
			dir.mkdirs();
		}
		File f = new File(path, System.currentTimeMillis() + ".png");
		try {
			f.createNewFile();
			FileOutputStream fOut = null;
			fOut = new FileOutputStream(f);
			bmp.compress(Bitmap.CompressFormat.PNG, 100, fOut);
			fOut.flush();
			fOut.close();
			return 1;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return -1;
		}
	}

	// 我们先看下质量压缩方法
	public static Bitmap compressImage(Bitmap image) {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);// 质量压缩方法，这里100表示不压缩，把压缩后的数据存放到baos中
		int options = 100;
		while (baos.toByteArray().length / 1024 > 100) { // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
			baos.reset();// 重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);// 这里压缩options%，把压缩后的数据存放到baos中
			options -= 10;// 每次都减少10
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());// 把压缩后的数据baos存放到ByteArrayInputStream中
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);// 把ByteArrayInputStream数据生成图片
		return bitmap;
	}

	// 图片按比例大小压缩方法（根据路径获取图片并压缩）
	public static Bitmap getimage(String srcPath) {
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		// 开始读入图片，此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);// 此时返回bm为空

		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		// 现在主流手机比较多是800*480分辨率，所以高和宽我们设置为
		float hh = 800f;// 这里设置高度为800f
		float ww = 800f;// 这里设置宽度为480f
		// 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
		int be = 1;// be=1表示不缩放
		if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
			be = (int) (newOpts.outWidth / ww);
		} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
			be = (int) (newOpts.outHeight / hh);
		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;// 设置缩放比例
		// 重新读入图片，注意此时已经把options.inJustDecodeBounds 设回false了
		bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
		return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
	}

	// 图片按比例大小压缩方法（根据Bitmap图片压缩）
	public static Bitmap comp(Bitmap image) {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
		if (baos.toByteArray().length / 1024 > 1024) {// 判断如果图片大于1M,进行压缩避免在生成图片（BitmapFactory.decodeStream）时溢出
			baos.reset();// 重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, 50, baos);// 这里压缩50%，把压缩后的数据存放到baos中
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		// 开始读入图片，此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		// 现在主流手机比较多是800*480分辨率，所以高和宽我们设置为
		float hh = 800f;// 这里设置高度为800f
		float ww = 480f;// 这里设置宽度为480f
		// 缩放比。由于是固定比例缩放，只用高或者宽其中一个数据进行计算即可
		int be = 1;// be=1表示不缩放
		if (w > h && w > ww) {// 如果宽度大的话根据宽度固定大小缩放
			be = (int) (newOpts.outWidth / ww);
		} else if (w < h && h > hh) {// 如果高度高的话根据宽度固定大小缩放
			be = (int) (newOpts.outHeight / hh);
		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;// 设置缩放比例
		// 重新读入图片，注意此时已经把options.inJustDecodeBounds 设回false了
		isBm = new ByteArrayInputStream(baos.toByteArray());
		bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
		return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
	}
	/**
	 * 图片不变形
	 * @param bitmap
	 * @param imageView
	 * @param width
	 * @param height
	 */
	public static void setBsetBitmap(Bitmap bitmap, ImageView imageView, int width,
			int height) {
		// 计算最佳缩放倍数
		// float scaleX = (float) width / bitmap.getWidth();
		// float scaleY = (float) height / bitmap.getHeight();
		// float bestScale = scaleX < scaleY ? scaleX : scaleY;
		// 计算最佳缩放倍数,以填充宽高为目标
		float scaleX = (float) width / bitmap.getWidth();
		float scaleY = (float) height / bitmap.getHeight();
		float bestScale = scaleX > scaleY ? scaleX : scaleY;
		// 以填充高度的前提下，计算最佳缩放倍数
		// float bestScale = (float) height / bitmap.getHeight();

		float subX = (width - bitmap.getWidth() * bestScale) / 2;
		float subY = (height - bitmap.getHeight() * bestScale) / 2;

		Matrix imgMatrix = new Matrix();
		imageView.setScaleType(ScaleType.MATRIX);
		// 缩放最佳大小
		imgMatrix.postScale(bestScale, bestScale);
		// 移动到居中位置显示
		imgMatrix.postTranslate(subX, subY);
		// 设置矩阵
		imageView.setImageMatrix(imgMatrix);

		imageView.setImageBitmap(bitmap);
	}

}